package cn.good.yan.sf.t4;

/**
 * 4 递归
 * 杨辉三角  （2种方式）
 *
 * @author shengren.yan
 * @create 2024-06-02
 */
public class Demo5 {

//  打印出杨辉三角：
//                       1
//                    1    1
//                  1    2    1
//                1    3    3    1
//              1    4    6    4    1
//            1    5    10    10    5    1
//          1    6    15    20    15    6    1
//        1    7    21    35    35    21    7    1
//      1    8    28    56    70    56    28    8    1
//    1    9    36    84    126    126    84    36    9    1

    // 1
    // 1 1
    // 1 2 1
    // 1 3 3 1
    // 1 4 6 4 1
    // 方式1： i 是行，j是列， 列是第一列和跟行一样也是0
    public static int getNum(int i, int j) {
        if (j == 0 || i == j) {
            return 1;
        }
        return getNum(i - 1, j - 1) + getNum(i - 1, j);
    }

    // 方式1： 打印出杨辉三角  - n 是要打印的行
    public static void println1(int n) {
        for (int i = 0; i < n; i++) {
            printkg(n, i); // 打印空格
            for (int j = 0; j <= i; j++) {
                int num = getNum(i, j);
                System.out.printf("%4d", num);
            }
            System.out.println(" ");
        }
    }

    // 打印空格
    public static void printkg(int n, int i) {
        int num = (n - 1 - i) * 2;
        for (int j = 0; j < num; j++) {
            System.out.print(" ");
        }
    }

    // 缓冲区，每次执行的 arr 是当前行的执行的
    static int[] arr = null;

    // 0 0 0 0 0
    // 1 0 0 0 0
    // 1 1 0 0 0  -- 1
    // 1 2 1 0 0
    // 1 3 3 1 0
    // 1 4 6 4 1
    // 方式2： i 是行，j是列， 列是第一列和跟行一样也是0
    public static void getNum2(int n) {
        if (n == 0) {
            arr[0] = 1;
            return;
        }
        for (int i = n; i > 0; i--) {
            arr[i] = arr[i - 1] + arr[i];
        }
    }

    // 方式2： 打印出杨辉三角 - n 是要打印的行
    public static void println2(int n) {
        arr = new int[n];
        for (int i = 0; i < n; i++) {
            printkg(n, i); // 打印空格
            getNum2(i);
            for (int j = 0; j <= i; j++) {
                System.out.printf("%4d", arr[j]);
            }
            System.out.println(" ");
        }
    }

    public static void main(String[] args) {
        // 方式1：
        println1(6);
        System.out.println("---------------------------------------------");
        // 方式2：
        println2(6);

    }

}
